package chaoyue.study.inner;

/**
 * 方法内部类
 * 方法所属的对象，用到的形参都会作为属性组合到内部类中
 * 所以内部类中操作的变量其实都是自己内部的局部变量，为了不引起歧义，所以要求传入内部类中使用的变量都为隐式final
 */
public class MethodInnerClassTest {
    private int a = 100;

    public void test(final int param) {
        final String str = "hello";
        // 在方法中创建的内部类，作用域只在这个方法内部
        class Inner {
            public void innerMethod() {
                System.out.println("outer a" + a);
                System.out.println("param " + param); // 形参必须为隐式final
                System.out.println("local var " + str);// 成员变量必须为隐式final
            }
        }
        Inner inner = new Inner();
        inner.innerMethod();
    }

    // 如果操作的是一个对象 依然可以进行重新赋值，相当于内部类中的变量和外部类中的变量指向的是同一个对象
    public void testChangeValue() {
        final String[] str = new String[]{"hello"};
        class Inner {
            public void innerMethod() {
                str[0] = "hello world";
            } // 引用本身没有变，变的是引用所关联的对象
        }
        Inner inner = new Inner();
        inner.innerMethod();
        System.out.println(str[0]);
    }

    public static void main(String[] args) {
        MethodInnerClassTest outer = new MethodInnerClassTest();
        outer.test(10);
        outer.testChangeValue();
    }
}
